package com.stone.business.jc.service;

/**
 * <pre>
 *  绩效考核
 * </pre>
 */

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import jxl.read.biff.BiffException;

import com.stone.business.gzjl.pojo.TabGzjl;
import com.stone.business.gzrwd.pojo.TGzrwd;
import com.stone.business.gzrwd.pojo.TGzrwdRw;
import com.stone.business.jc.pojo.TCxxc;
import com.stone.business.jc.pojo.TCxxcRy;
import com.stone.business.jc.pojo.TGzzlkh;
import com.stone.business.jc.pojo.TJxcp;
import com.stone.business.jc.pojo.TKs;
import com.stone.business.jc.pojo.TKsRy;
import com.stone.business.jc.pojo.TPlanMonth;
import com.stone.business.jc.pojo.TPlanWeek;
import com.stone.business.jc.pojo.TPlanWeekDetail;
import com.stone.business.jc.pojo.TUserJxda;
import com.stone.business.plan.pojo.TBzgzrw;
import com.stone.business.plan.pojo.TPlan;
import com.stone.para.IConstant;
import com.stone.utils.DateFormatTool;
import com.stone.utils.NumUtils;
import com.stone.utils.Resources;
import com.stone.utils.StringUtils;

import frm.ssh.service.BaseService;

public class JcCommonService extends BaseService {

	/**
	 * 工作量统计
	 * 
	 * @param id
	 */
	@SuppressWarnings("unchecked")
	public void deleteJxcp(String id) {

		// 附件
		List<TJxcp> list = super.findListByHql(" from TJxcp where id in (" + id
				+ ")");

		for (TJxcp f : list) {

			File tempFile = new File(Resources.getString("jxcppath", "struts")
					+ f.getFilenameen());

			if (tempFile.exists()) {
				tempFile.delete();
			}
		}

		// 倒闸操作预告任务
		super.doDelAll(id, "TJxcp");

	}

	/**
	 * 考试
	 */
	public void saveKs(TKs entity, List<TKsRy> ksrylist) {

		// 考试基本信息表
		if (entity.getId() == null || entity.getId() == 0) {
			super.save(entity);
		} else {
			super.update(entity);
		}

		// 人员列表
		if (ksrylist != null) {

			for (TKsRy ry : ksrylist) {

				if (ry != null) {

					ry.setKsid(entity.getId());
					if (ry.getId() == null || ry.getId() == 0) {
						super.save(ry);

					} else {
						super.update(ry);
					}

				}
			}
		}

	}

	/**
	 * 考试
	 */
	public void deleteKs(String ids) {
		super
				.deleteByDHql("ksid in (" + ids + ")", null, TKsRy.class
						.getName());
		super.deleteAll(ids, TKs.class.getName());

	}

	/**
	 * 创新宣传
	 */
	public void saveCxxc(TCxxc entity, List<TCxxcRy> cxxcrylist) {

		// 创新宣传基本信息表
		if (entity.getId() == null || entity.getId() == 0) {
			super.save(entity);
		} else {
			super.update(entity);
		}

		// 人员列表
		if (cxxcrylist != null) {

			for (TCxxcRy ry : cxxcrylist) {

				if (ry != null) {

					ry.setKsid(entity.getId());
					if (ry.getId() == null || ry.getId() == 0) {
						super.save(ry);

					} else {
						super.update(ry);
					}

				}
			}
		}

	}

	/**
	 * 创新宣传
	 */
	public void deleteCxxc(String ids) {
		super.deleteByDHql("ksid in (" + ids + ")", null, TCxxcRy.class
				.getName());
		super.deleteAll(ids, TCxxc.class.getName());

	}

	/**
	 * 保存月工作计划
	 */
	public void savePlanMonth(List<TPlanMonth> list) {

		// 人员列表
		if (list != null) {

			for (TPlanMonth entity : list) {

				if (entity != null) {

					if (entity.getId() == null || entity.getId() == 0) {
						super.save(entity);

					} else {
						super.update(entity);
					}

				}
			}
		}
	}

	/**
	 * 删除月工作计划
	 */
	public void deletePlanMonth(String id) {

		for (String s : id.split(",")) {
			super.deleteByDHql("TO_CHAR(plandate,'YYYY-MM') = '" + s.trim()
					+ "'", null, TPlanMonth.class.getName());
		}

	}

	/**
	 * 保存周工作计划
	 */
	public void savePlanWeek(TPlanWeek planWeek, List<TPlanWeekDetail> list) {

		// 人员列表
		if (list != null) {

			for (TPlanWeekDetail entity : list) {

				if (entity != null) {
                   if(planWeek.getId() == null || planWeek.getId() == 0){//by wangtao update20121128 从个人代办事项过来没有planWeekid
                	   
                   }else{
					entity.setPlanweekid(planWeek.getId());
                   }
					if (entity.getId() == null || entity.getId() == 0) {
						super.save(entity);

					} else {
						super.update(entity);
					}

				}
			}
		}
	}

	/**
	 * 删除周工作计划
	 */
	public void deletePlanWeek(String ids) {

		super.deleteByDHql("planweekid in (" + ids + ")", null,
				TPlanWeekDetail.class.getName());
		super.deleteAll(ids, TPlanWeek.class.getName());

	}

	/**
	 * 导出时保存绩效表及绩效档案表
	 * 
	 * @throws IOException
	 * @throws BiffException
	 */
	public void saveJxda(TJxcp entity, String filenameen, String startdate,
			String enddate, List<HashMap<String, Object>> tempListUser,
			List<String[]> exp1, List<String[]> exp2, String fgflag) {

		if (entity == null) {
			entity = new TJxcp();
		}

		entity.setFilenamecn(Resources.getString("jxcpname", "struts"));
		entity.setFilenameen(filenameen);
		entity.setTjsjks(DateFormatTool.formatToDate(startdate, "yyyy-MM-dd"));
		entity.setTjsjjs(DateFormatTool.formatToDate(enddate, "yyyy-MM-dd"));
		super.save(entity);
		if (!"1".equals(fgflag)) {
			System.out.println("fgflag==" + fgflag);
			return;
		}
		// 删除掉绩效档案原来的数据
		super.deleteByDHql("to_char(rq,'YYYY-MM') = '"
				+ startdate.substring(0, 7) + "'", null, TUserJxda.class
				.getName());

		// 员工基础信息表
		for (int j = 0; j < tempListUser.size(); j++) {

			HashMap<String, Object> map = tempListUser.get(j);

			TUserJxda jxda = new TUserJxda();
			// 用户ID
			jxda.setUserid(Long.parseLong(map.get("id").toString()));
			// 用户名
			jxda.setUsername((String) map.get("name"));
			jxda.setRq(DateFormatTool.formatToDate(startdate, "yyyy-MM-dd"));

			super.save(jxda);

		}

		// 档案得分 计算 <考核奖金总得分>, <工作量人数>, <当月天数>, <未值班天数> 最终获得日均得分
		// 考核奖金总得分 （ 个人绩效得分 × 奖金系数）的和
		double moneyTotal = 0.00;
		// 工作量人数 (奖金系数 > 0 ? 1 : 0)的和
		int gzlrs = 0;
		// 当月天数 统计结束日期 - 统计开始日期 + 1
		int dyts = Integer.parseInt(enddate.replaceAll("-", ""))
				- Integer.parseInt(startdate.replaceAll("-", "")) + 1;
		// 未值班天数
		int wzbts = 0;

		int index = 1;

		// 参与考核
		for (String[] v : exp1) {
			// 个人绩效得分, 工作量得分,工作质量得分,专项考核,未值班天数,培训得分,考试得分,宣传报道得分,创新成果得分
			super
					.updateByHQL(
							"update TUserJxda set grjxdf = ?, gzldf = ?, gzzldf = ?, zxkhdf = ?, wzbts = ?, pxdf = ?, ksdf = ?, xcbddf = ?, cxcgdf = ?  where username = ? and rq = ? ",
							new Object[] {
									NumUtils.parseDouble(v[2])
											+ NumUtils.parseDouble(v[3])
											+ NumUtils.parseDouble(v[4]),
									NumUtils.parseDouble(v[2]),
									NumUtils.parseDouble(v[3]),
									NumUtils.parseDouble(v[4]),
									NumUtils.parseDouble(v[5]),
									NumUtils.parseDouble(v[8]),
									NumUtils.parseDouble(v[9]),
									NumUtils.parseDouble(v[10]),
									NumUtils.parseDouble(v[11]),
									v[0],
									DateFormatTool.formatToDate(startdate,
											"yyyy-MM-dd") });

			// 参与考核人员 个人绩效得分 × 奖金系数
			moneyTotal += (NumUtils.parseDouble(v[2])
					+ NumUtils.parseDouble(v[3]) + NumUtils.parseDouble(v[4]))
					* NumUtils.parseDouble(v[12]);

			// 奖金系数 > 0 ? 1 : 0 公式最多按24人
			if (index <= IConstant.JXKH_GZLRS) {
				gzlrs += NumUtils.parseDouble(v[13]) > 0 ? 1 : 0;
			}

			++index;

			// 未值班天数
			wzbts += NumUtils.parseInt(v[5]);
		}

		// 考核细则
		List<TGzzlkh> l = super
				.findListByHql("from TGzzlkh where to_char(khrq,'YYYY-MM-DD') = '"
						+ startdate + "'");

		for (TGzzlkh g : l) {

			super.updateByHQL("update TUserJxda set khxznr = khxznr || '★"
					+ g.getKhxzremark() + "' where userid = ? and rq = ? ",
					new Object[] {
							g.getUserid(),
							DateFormatTool
									.formatToDate(startdate, "yyyy-MM-dd") });
		}

		// 日均得分 个人奖金计算表!Q2/(个人奖金计算表!T2*W2-个人奖金计算表!M2)
		double rjdf = moneyTotal / (gzlrs * dyts - wzbts);

		// 不参与考核 档案得分 = 当月天数 × 日均得分 个人奖金
		double bcykefs = rjdf * dyts;
		for (String[] v : exp2) {

			super
					.updateByHQL(
							"update TUserJxda set gzzldf = ?, zxkhdf = ?, wzbts = ?, dadf = ? where username = ? and rq = ? ",
							new Object[] {
									NumUtils.parseDouble(v[3]),
									NumUtils.parseDouble(v[4]),
									NumUtils.parseDouble(v[5]),
									NumUtils.parseDouble(NumUtils.roundHalfup(
											String.valueOf(bcykefs), 2)),
									v[0],
									DateFormatTool.formatToDate(startdate,
											"yyyy-MM-dd") });

		}

		// 参与考核 档案得分 = 个人得分 + 未值班天数 × 日均得分
		// 参与考核
		for (String[] v : exp1) {

			double fs = (NumUtils.parseDouble(v[2])
					+ NumUtils.parseDouble(v[3]) + NumUtils.parseDouble(v[4]))
					+ NumUtils.parseInt(v[5]) * rjdf;
			super
					.updateByHQL(
							"update TUserJxda set dadf = ? where username = ? and rq = ? ",
							new Object[] {
									NumUtils.parseDouble(NumUtils.roundHalfup(
											String.valueOf(fs), 2)),
									v[0],
									DateFormatTool.formatToDate(startdate,
											"yyyy-MM-dd") });
		}

	}

	// 保存工作记录(工作记录回填)
	public void savegzjl(TabGzjl entity, List<TGzrwdRw> bzgzrwList) {

		// 保存工作记录
		if (entity != null && entity.getId() == null) {
			super.save(entity);
		} else {
			super.update(entity);
		}

		int count = 0;

		// 保存班组工作任务
		if (bzgzrwList != null && bzgzrwList.size() > 0) {
			for (int i = 0; i < bzgzrwList.size(); i++) {
				
				// 保存工作任务单子表
				TGzrwdRw tBzgzrw = bzgzrwList.get(i);
				super.updateByDHql(
						"gzqk = ?, ylwt = ?,finishflag=?",
						"id = '" + tBzgzrw.getId() + "'",
						new Object[] { tBzgzrw.getGzqk(), tBzgzrw.getYlwt(),tBzgzrw.getFinishflag()} ,null,
						"TGzrwdRw");
				//遗留问题的工作记录回填时如填写完成
				TPlan tplan = (TPlan) super.findById(tBzgzrw.getPlanid(),
						TPlan.class.getName());
				if (!StringUtils.isNullOrBlank(tplan.getGzrwdrwid()+"")){
					super.updateByDHql(
							"finishflag=?",
							"id = '" + tplan.getGzrwdrwid() + "'",
							new Object[] {tBzgzrw.getFinishflag()} ,null,
							"TGzrwdRw");
				}
				// 工作情况不为空，遗留问题,是否完成不为空
				if (!StringUtils.isNullOrBlank(tBzgzrw.getGzqk())
						&& !StringUtils.isNullOrBlank(tBzgzrw.getYlwt())&& !StringUtils.isNullOrBlank(tBzgzrw.getFinishflag())) {
					count += 1;
				}

				// 回填缺陷表。 消缺负责人 消缺成员 遗留问题
				if (tBzgzrw.getSbqxid() != null && tBzgzrw.getSbqxid() != 0) {
					
					// 获得工作任务单
					TGzrwd gzrwd = (TGzrwd) super.findById(entity.getGzrwdid(), TGzrwd.class.getName());
					
					// 回填缺陷记录
					super.updateByDHql(
									"xcr = ?, xcrname = ?, xqcy = ?, xqcyname = ?, ylwt = ?,sjxqqk= ? ",
									"id = '" + tBzgzrw.getSbqxid() + "'",
									new Object[] { gzrwd.getZbz(),
											gzrwd.getZbzname(), gzrwd.getZby(),
											gzrwd.getZbyname(),
											tBzgzrw.getYlwt(),tBzgzrw.getGzqk() }, null,
									"TSbqxjl");
				}
			}
		}
		
	}
	// 归档工作记录(工作记录回填)by wangtao add 2012-09-10
	public void savehistory(TabGzjl entity, List<TGzrwdRw> bzgzrwList) {

		// 保存工作记录
		if (entity != null && entity.getId() == null) {
			super.save(entity);
		} else {
			super.update(entity);
		}

		int count = 0;

		// 保存班组工作任务
		if (bzgzrwList != null && bzgzrwList.size() > 0) {
			for (int i = 0; i < bzgzrwList.size(); i++) {
				
				// 保存工作任务单子表
				TGzrwdRw tBzgzrw = bzgzrwList.get(i);
				super.updateByDHql(
						"gzqk = ?, ylwt = ?,finishflag=?",
						"id = '" + tBzgzrw.getId() + "'",
						new Object[] { tBzgzrw.getGzqk(), tBzgzrw.getYlwt(),tBzgzrw.getFinishflag()} ,null,
						"TGzrwdRw");
				//遗留问题的工作记录回填时如填写完成
				TPlan tplan = (TPlan) super.findById(tBzgzrw.getPlanid(),
						TPlan.class.getName());
				if (!StringUtils.isNullOrBlank(tplan.getGzrwdrwid()+"")){
					super.updateByDHql(
							"finishflag=?",
							"id = '" + tplan.getGzrwdrwid() + "'",
							new Object[] {tBzgzrw.getFinishflag()} ,null,
							"TGzrwdRw");
				}
				// 工作情况不为空，遗留问题,是否完成不为空
				if (!StringUtils.isNullOrBlank(tBzgzrw.getGzqk())
						&& !StringUtils.isNullOrBlank(tBzgzrw.getYlwt())&& !StringUtils.isNullOrBlank(tBzgzrw.getFinishflag())) {
					count += 1;
				}

				// 回填缺陷表。 消缺负责人 消缺成员 遗留问题
				if (tBzgzrw.getSbqxid() != null && tBzgzrw.getSbqxid() != 0) {
					
					// 获得工作任务单
					TGzrwd gzrwd = (TGzrwd) super.findById(entity.getGzrwdid(), TGzrwd.class.getName());
					
					// 回填缺陷记录
					super.updateByDHql(
									"xcr = ?, xcrname = ?, xqcy = ?, xqcyname = ?, ylwt = ?,sjxqqk= ? ",
									"id = '" + tBzgzrw.getSbqxid() + "'",
									new Object[] { gzrwd.getZbz(),
											gzrwd.getZbzname(), gzrwd.getZby(),
											gzrwd.getZbyname(),
											tBzgzrw.getYlwt(),tBzgzrw.getGzqk() }, null,
									"TSbqxjl");
				}
			}
		}
		
		// 归档 同一个计划的所有工作任务单
		if (count != 0 && count == bzgzrwList.size()) {
			
			// 根据工作任务单ID获得计划ID
			List<HashMap<String, Object>> list = super.getListByDHql(
					"planid as planid, bgzr as bzid", "id = ?", new Object[] { entity
							.getGzrwdid() }, "", TGzrwd.class.getName());
			
			// 根据计划ID归档计划下的所有的工作任务单
			if (list.size() > 0) {
				super
						.updateByDHql("state = '9'", "planid = '"
								+ list.get(0).get("planid") + "' and bgzr = '" + list.get(0).get("bzid") + "'" , null, null,
								"TGzrwd");
			}
		}
	}
}
